home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / PASCAL / ALLSWAGS.ZIP / SWAGG-M.ZIP / MISC.SWG / 0147_Multitasking.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-05-26  |  2.5 KB  |  86 lines

  1. {
  2. > Does anyone know how to create a popup window and have a program
  3. > running in the background? I've seen this done in such bbs programs
  4.  
  5. Multitasking.  /[:)  I suppose you guessed that part, though.  Here's the
  6. assembly portion of a _working_ multi-tasker I did in 2nd year:
  7.  
  8. NAME ProcSwitch
  9. ; Written by Dave Jarvis
  10.  
  11. DOSSEG
  12. .MODEL SMALL
  13.  
  14. .CODE
  15.  
  16. PUBLIC _new_clock 
  17. EXTRN _new_process : NEAR 
  18.  
  19. NUM_TICKS    EQU      45               ; 45 clock ticks = 2.5 seconds 
  20.  
  21. _new_clock   PROC    NEAR 
  22.  
  23.              CMP _tick_count, NUM_TICKS 
  24.              JE GetNewProc             ; Get a new process 
  25.  
  26.              INC _tick_count           ; Resume counting interrupts 
  27.              JMP DoneInt               ; End of interrupt. 
  28.  
  29. GetNewProc:  MOV _tick_count, 0  ; Reset the interrupt counter 
  30.  
  31.              PUSH DS             ; Save all registers on "stack" 
  32.              PUSH ES 
  33.              PUSH AX 
  34.              PUSH BX 
  35.              PUSH CX 
  36.              PUSH DX 
  37.              PUSH SI 
  38.              PUSH DI 
  39.              PUSH BP 
  40.  
  41.              MOV AX, SS         ; Point _S_ss and _S_sp to current 
  42.              MOV _S_ss, AX      ; SS and SP values. 
  43.              MOV AX, SP 
  44.              MOV _S_sp, AX 
  45.  
  46.              CALL _new_process  ; Get new process' stack registers 
  47.  
  48.              MOV AX, _S_ss      ; Point SS:SP to process stack segment 
  49.              MOV SS, AX         ;   registers found in call to _new_process 
  50.              MOV AX, _S_sp 
  51.              MOV SP, AX 
  52.  
  53.              POP BP             ; Restore interrupted process' registers
  54.              POP DI             ;   from "stack" 
  55.              POP SI 
  56.              POP DX 
  57.              POP CX
  58.  
  59.              POP BX 
  60.              POP AX
  61.              POP ES
  62.              POP DS
  63.  
  64. DoneInt:     PUSH AX
  65.              MOV AL, 20h        ; Load EOI into AL
  66.              OUT 20h, AL        ; Send PIC chip EOI signal
  67.              POP AX
  68.              IRET               ; Return to interrupted process
  69.  
  70. _new_clock   ENDP
  71.  
  72. .DATA?
  73.        EXTRN _tick_count:WORD
  74.        EXTRN _S_ss:WORD, _S_sp:WORD
  75.  
  76. END
  77.  
  78. {
  79. You take over the $1C interrupt, count the ticks, and restore the state
  80. of all the registers when the ticks hits a certain value.
  81.  
  82. What you have to do is set up a procedure (called New_Process) which
  83. changes the stack pointer to an array in memory which contains the values
  84. of the registers (all listed + IP, CS, & FLAGS) prior to the process
  85. being interrupted.
  86. }